using System;

namespace Insesoft.Entities
{
    public class Cotizacion : EntidadBase
    {
        #region Declarations
        private Empresa empresa;
        private Cliente cliente;
        private Usuario usuario;
        private Vendedor vendedor;
        private Material material;
        private Linea linea;
        private TipoCambio tipocambio;
        private DateTime? fecha;
        private decimal preciounitario;
        private decimal subtotal;
        private decimal porcentaje;
        private decimal totalUsd;
        private decimal totalcol;
        private int cantidad;
        private decimal montaje;
        private decimal theBase;
        private decimal altura;
        private decimal tintas;
        private decimal cubrimiento;
        private decimal troquel;
        private decimal doblez;
        private decimal cuatricromia;
        private decimal otro;
        private bool evento;
        private decimal porcevento;
        private bool aplicada;
        private DateTime? fecaplicada;
        private DateTime? fecregistro;
        private string numpedido;
        private decimal preciomaterial;
        private decimal preciotintas;
        private decimal precioarte;
        private decimal precioimpresion;
        private decimal preciomolde;
        private decimal preciocorte;
        private decimal preciopositivo;
        private decimal preciosolvente;
        private decimal rendimiento;
        private decimal laminas;
        private string observacion;
        private decimal divlargo;
        private decimal divancho;

        private ICotizador cotizador;

        public Cotizacion()
        {
            cotizador = new Cotizador(this);
        }

        #endregion

        #region Properties: Public

        public virtual Empresa Empresa
        {
            get { return empresa; }
            set { isChanged |= (empresa != value); empresa = value; }
        }

        public virtual Cliente Cliente
        {
            get { return cliente; }
            set { isChanged |= (cliente != value); cliente = value; }
        }

        public virtual Usuario Usuario
        {
            get { return usuario; }
            set { isChanged |= (usuario != value); usuario = value; }
        }

        public virtual Vendedor Vendedor
        {
            get { return vendedor; }
            set { isChanged |= (vendedor != value); vendedor = value; }
        }

        public virtual Material Material
        {
            get { return material; }
            set { isChanged |= (material != value); material = value; }
        }

        public virtual Linea Linea
        {
            get { return linea; }
            set { isChanged |= (linea != value); linea = value; }
        }

        public virtual TipoCambio TipoCambio
        {
            get { return tipocambio; }
            set { isChanged |= (tipocambio != value); tipocambio = value; }
        }

        public virtual DateTime? Fecha
        {
            get { return fecha; }
            set
            {
                if (fecha != value)
                {
                    fecha = value;
                    isChanged = true;
                }
            }
        }

        public virtual decimal PrecioUnitario
        {
            get { return preciounitario; }
            set { isChanged |= (preciounitario != value); preciounitario = value; }
        }

        public virtual decimal Subtotal
        {
            get { return subtotal; }
            set { isChanged |= (subtotal != value); subtotal = value; }
        }

        public virtual decimal Porcentaje
        {
            get { return porcentaje; }
            set { isChanged |= (porcentaje != value); porcentaje = value; }
        }

        public virtual decimal TotalUsd
        {
            get { return totalUsd; }
            set { isChanged |= (totalUsd != value); totalUsd = value; }
        }

        public virtual decimal TotalCol
        {
            get { return totalcol; }
            set { isChanged |= (totalcol != value); totalcol = value; }
        }

        public virtual int Cantidad
        {
            get { return cantidad; }
            set { isChanged |= (cantidad != value); cantidad = value; }
        }

        public virtual decimal Montaje
        {
            get { return montaje; }
            set { isChanged |= (montaje != value); montaje = value; }
        }

        public virtual decimal Base
        {
            get { return theBase; }
            set { isChanged |= (theBase != value); theBase = value; }
        }

        public virtual decimal Altura
        {
            get { return altura; }
            set { isChanged |= (altura != value); altura = value; }
        }

        public virtual decimal Tintas
        {
            get { return tintas; }
            set { isChanged |= (tintas != value); tintas = value; }
        }

        public virtual decimal Cubrimiento
        {
            get { return cubrimiento; }
            set { isChanged |= (cubrimiento != value); cubrimiento = value; }
        }

        public virtual decimal Troquel
        {
            get { return troquel; }
            set { isChanged |= (troquel != value); troquel = value; }
        }

        public virtual decimal Doblez
        {
            get { return doblez; }
            set { isChanged |= (doblez != value); doblez = value; }
        }

        public virtual decimal Cuatricromia
        {
            get { return cuatricromia; }
            set { isChanged |= (cuatricromia != value); cuatricromia = value; }
        }

        public virtual decimal Otro
        {
            get { return otro; }
            set { isChanged |= (otro != value); otro = value; }
        }

        public virtual bool Evento
        {
            get { return evento; }
            set { isChanged |= (evento != value); evento = value; }
        }

        public virtual decimal PorcEvento
        {
            get { return porcevento; }
            set { isChanged |= (porcevento != value); porcevento = value; }
        }

        public virtual bool Aplicada
        {
            get { return aplicada; }
            set { isChanged |= (aplicada != value); aplicada = value; }
        }

        public virtual DateTime? FecAplicada
        {
            get { return fecaplicada; }
            set
            {
                if (fecaplicada != value)
                {
                    fecaplicada = value;
                    isChanged = true;
                }
            }
        }

        public virtual DateTime? FecRegistro
        {
            get { return fecregistro; }
            set
            {
                if (fecregistro != value)
                {
                    fecregistro = value;
                    isChanged = true;
                }
            }
        }

        public virtual string NumPedido
        {
            get { return numpedido; }
            set
            {
                CheckLength("NumPedido", value, 20);
                isChanged |= (numpedido != value); numpedido = value;
            }
        }

        public virtual decimal PrecioMaterial
        {
            get { return preciomaterial; }
            set { isChanged |= (preciomaterial != value); preciomaterial = value; }
        }

        public virtual decimal PrecioTintas
        {
            get { return preciotintas; }
            set { isChanged |= (preciotintas != value); preciotintas = value; }
        }

        public virtual decimal PrecioArte
        {
            get { return precioarte; }
            set { isChanged |= (precioarte != value); precioarte = value; }
        }

        public virtual decimal PrecioImpresion
        {
            get { return precioimpresion; }
            set { isChanged |= (precioimpresion != value); precioimpresion = value; }
        }

        public virtual decimal PrecioMolde
        {
            get { return preciomolde; }
            set { isChanged |= (preciomolde != value); preciomolde = value; }
        }

        public virtual decimal PrecioCorte
        {
            get { return preciocorte; }
            set { isChanged |= (preciocorte != value); preciocorte = value; }
        }

        public virtual decimal PrecioPositivo
        {
            get { return preciopositivo; }
            set { isChanged |= (preciopositivo != value); preciopositivo = value; }
        }

        public virtual decimal PrecioSolvente
        {
            get { return preciosolvente; }
            set { isChanged |= (preciosolvente != value); preciosolvente = value; }
        }

        public virtual decimal Rendimiento
        {
            get { return rendimiento; }
            set { isChanged |= (rendimiento != value); rendimiento = value; }
        }

        public virtual decimal Laminas
        {
            get { return laminas; }
            set { isChanged |= (laminas != value); laminas = value; }
        }

        public virtual string Observacion
        {
            get { return observacion; }
            set
            {
                CheckLength("Observacion", value, 500);
                isChanged |= (observacion != value); observacion = value;
            }
        }

        public virtual decimal DivLargo
        {
            get { return divlargo; }
            set { isChanged |= (divlargo != value); divlargo = value; }
        }

        public virtual decimal DivAncho
        {
            get { return divancho; }
            set { isChanged |= (divancho != value); divancho = value; }
        }

        #endregion

        #region Methods: Public

        public virtual void SetCotizador(ICotizador newCotizador)
        {
            cotizador = newCotizador;
        }

        public virtual void Calcular(Precio precio, decimal impVenta)
        {
            cotizador.CalcularRendimientos();
            PrecioMaterial = cotizador.CalcularPrecioMaterial(impVenta);
            PrecioTintas = cotizador.CalcularPrecioTintas(precio.Tinta);
            PrecioArte = cotizador.CalcularPrecioArte(precio.Arte);
            PrecioPositivo = cotizador.CalcularPrecioPositivo(precio.Positivo);
            PrecioMolde = cotizador.CalcularPrecioMolde(precio.Molde);
            PrecioSolvente = cotizador.CalcularPrecioSolvente(precio.Solvente);
            PrecioCorte = cotizador.CalcularPrecioCorte(precio.Corte);
            PrecioImpresion = cotizador.CalcularPrecioImpresion(precio);
            Subtotal = cotizador.CalcularSubtotal();
            TotalCol = cotizador.CalcularTotalCol();
            TotalUsd = cotizador.CalcularTotalUsd();
            PrecioUnitario = cotizador.CalcularPrecioUnitario();
        }
        
        public virtual Cotizacion Copy()
        {
            var copy = Clone();
            copy.Aplicada = false;
            copy.Id = 0;
            copy.FecAplicada = null;
            copy.NumPedido = "";
            return copy;
        }
        
        #endregion

        #region Methods: Non-Public
        
        protected virtual Cotizacion Clone()
        {
            return MemberwiseClone() as Cotizacion;
        }

        #endregion
    }
}
